{# 每个消息要实现的模板 #}
{% macro render_dpt_msg(dpt_msg) %}
/****************************************************************************************************
 * @did     {{ dpt_msg.消息编号 }} -> k{{ dpt_brief.协议代码 }}MsgId{{ dpt_msg.消息代码 }}
 * @name    {{ dpt_msg.消息名称 }}
 * @brief   {{ dpt_msg.消息说明 }}
 ****************************************************************************************************/
#pragma pack(push, 1)
typedef struct T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }}MemTag T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }}Mem;
struct T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }}MemTag
{
    {%- for dpt_data in dpt_msg.data_list %}
    {%- if dpt_data.数据类型 in ['Mem'] %}
    char {{ dpt_data.数据代码 }}[{{ Dpt_CMemSize(dpt_data.数据长度) }}];    // {{ dpt_data.数据名称 }}, {{ dpt_data.数据说明 }}, 数据长度：{{ dpt_data.数据长度 }}
    {%- else %}
    {{ dpt_data.数据类型}} {{ dpt_data.数据代码 }};    // {{ dpt_data.数据名称 }}, {{ dpt_data.数据说明 }}
    {%- endif %}
    {%- endfor %}
};
#pragma pack(pop)

typedef struct T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }}Tag T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }};
struct T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }}Tag
{
    {%- for dpt_data in dpt_msg.data_list %}
    {%- if dpt_data.数据类型 in ['Mem'] %}
    void *{{ dpt_data.数据代码 }};    // {{ dpt_data.数据名称 }}, {{ dpt_data.数据说明 }}, 数据长度：{{ dpt_data.数据长度 }}
    {%- else %}
    {{ dpt_data.数据类型}} {{ dpt_data.数据代码 }};    // {{ dpt_data.数据名称 }}, {{ dpt_data.数据说明 }}
    {%- endif %}
    {%- endfor %}
};

/**
 * @brief   {{ dpt_msg.消息名称 }} 消息（did:{{ dpt_msg.消息编号 }}）编码函数
 * @param   msg 数据结构指针
 * @param   buf 数据缓冲区
 * @param   len 数据缓冲区长度
 * @return  >=0 成功，编码使用的数据包长度
 *          < 0 失败
 */
Int32 {{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }}Encode(T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }} *msg, Byte *buf, Int32 len);

/**
 * @brief   {{ dpt_msg.消息名称 }} 消息（did:{{ dpt_msg.消息编号 }}）解码函数
 * @param   msg 数据结构指针
 * @param   buf 数据缓冲区
 * @param   len 数据缓冲区长度
 * @return  >=0 成功，解码消耗的数据包长度
 *          < 0 失败
 */
Int32 {{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }}Decode(T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }} *msg, const Byte *buf, Int32 len);
{% endmacro -%}
/***** File generated by dpt(tool data_protocol_tool). ******/
/**
 * @file        {{ var_filename }}.h
 * @brief       XXXX
 * @note        XXXX
 * @author      {{ var_author }}({{ var_email }}) 
 * @date        {{ var_date }} {{ var_time }}
 * @version     1.0

 * @par         修改日志
 * <table>
 * <tr><th>Date         <th>Version     <th>Author      <th> Description
 * <tr><td>{{ var_date }}   <td>1.0         <td>{{ var_author }}       <td> 创建初始版本
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */

#ifndef _{{ var_filename | upper }}_H_
#define _{{ var_filename | upper }}_H_

#include "ofc/ofc_types.h"

#ifdef __cplusplus
extern "C"
{
#endif

// 消息编号
enum T{{ dpt_brief.协议代码 }}MsgIdTag
{
{%- for dpt_msg in dpt_msg_list %}
    k{{ dpt_brief.协议代码 }}MsgId{{ dpt_msg.消息代码 }} = {{ dpt_msg.消息编号 }}, // {{ dpt_msg.消息名称 }}
{%- endfor %}
};
typedef enum T{{ dpt_brief.协议代码 }}MsgIdTag T{{ dpt_brief.协议代码 }}MsgId;


// 消息结构体定义 + 编解码函数声明
{%- for dpt_msg in dpt_msg_list %}
{{ render_dpt_msg(dpt_msg) }}
{%- endfor %}

#ifdef __cplusplus
}  ///< extern "C"
#endif

#endif  ///< _{{ var_filename | upper }}_H_


